package com.projetosi.web.server.sistema.objetos;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import com.projetosi.web.server.sistema.sistema.RepositorioDeDados;

/**
 * 
 * @author Filipe Alencar , Rodrigo L. de Brito , Felipe Jose , Thiago Viturino e Victor Hugo
 * Ranking dos usuários. Permite que o usuario visualize rankings relativos a quantidade de emprestimos completados, 
 * na situação em que o usuário foi o emprestador. Além disso, há 2 categorias de rankings: global e entre amigos.
 */
public class Ranking {
	List<Usuario> listaDeTodosUsuarios = (List<Usuario>) RepositorioDeDados.getInstance().getUsuarios();
	/**
	 * Permite que o usuario visualize rankings relativos a quantidade de emprestimos completados
	 * @param idSessao - Id de sessao do usuario que solicita o ranking
	 * @param categoria - Tipo do rankin que ele deseja ver 
	 * @return - Retorna um mapa ja ordenado em ordem do MAIOR para o menor
	 * @throws Exception 
	 */
	public String getRanking(Usuario user,String categoria) throws Exception{

		Map<Integer, List<String> > mapaRanking = new TreeMap<Integer, List<String>>(Collections.reverseOrder());

		if(categoria.equals("amigos")){
			for(Usuario usuario: user.getListaDeAmigosAdicionados()){
				if(!mapaRanking.containsKey(usuario.getNumeroDeEmprestimosRealizados())){
					List<String> listaDeUsuario = new ArrayList<String>();
					listaDeUsuario.add(usuario.getLogin());
					mapaRanking.put(usuario.getNumeroDeEmprestimosRealizados(), listaDeUsuario);
				}else if (mapaRanking.containsKey(usuario.getNumeroDeEmprestimosRealizados())) {
					List<String> listaDeUsuario = mapaRanking.get(usuario.getNumeroDeEmprestimosRealizados());
					listaDeUsuario.add(usuario.getLogin());
					mapaRanking.put(usuario.getNumeroDeEmprestimosRealizados(), listaDeUsuario);
				}			
			}
			if(!mapaRanking.containsKey(user.getNumeroDeEmprestimosRealizados())){
				List<String> listaDeUsuario = new ArrayList<String>();
				listaDeUsuario.add(user.getLogin());
				mapaRanking.put(user.getNumeroDeEmprestimosRealizados(), listaDeUsuario);
			}else{
				List<String> listaDeUsuario = mapaRanking.get(user.getNumeroDeEmprestimosRealizados());
				listaDeUsuario.add(user.getLogin());
				mapaRanking.put(user.getNumeroDeEmprestimosRealizados(), listaDeUsuario);
			}
		}	
		if(categoria.equals("global")){
			for(Usuario usuario: listaDeTodosUsuarios){
				if(!mapaRanking.containsKey(usuario.getNumeroDeEmprestimosRealizados())){
					List<String> listaDeUsuario = new ArrayList<String>();
					listaDeUsuario.add(usuario.getLogin());
					mapaRanking.put(usuario.getNumeroDeEmprestimosRealizados(), listaDeUsuario);
				}else if (mapaRanking.containsKey(usuario.getNumeroDeEmprestimosRealizados())) {
					List<String> listaDeUsuario = mapaRanking.get(usuario.getNumeroDeEmprestimosRealizados());
					listaDeUsuario.add(usuario.getLogin());
					mapaRanking.put(usuario.getNumeroDeEmprestimosRealizados(), listaDeUsuario);
				}

			}

		}
		return imprimeRanking(mapaRanking);
	}

	public String imprimeRanking(Map<Integer, List<String> > mapaRanking){
		Collection<List<String>> mapa =  mapaRanking.values();
		Iterator<List<String>> itr = mapa.iterator();
		StringBuilder str = new StringBuilder();
		while(itr.hasNext()){
			List<String> lista = itr.next();
			for (String login : lista){
				str.append(login);
				str.append("; ");
			}
		}
		return str.toString().substring(0, str.toString().length()-2);
	}
}
